package com.imooc.security.core.validate.code;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.ServletWebRequest;

import com.imooc.security.core.properties.SecurityConstants;

/**
 * 4.10.19 重构8
 * 生成校验码的请求处理器
 */
@RestController
public class ValidateCodeController {

	// 4.12.6 10 常量规范化
	/*public static final String SESSION_KEY_PREFIX = "SESSION_KEY_FOR_CODE_";*/
	
	@Autowired
	private ValidateCodeProcessorHolder validateCodeProcessorHolder;

	/**
	 * 创建验证码，根据验证码类型不同，调用不同的 {@link ValidateCodeProcessor}接口实现
	 * 
	 * @param request
	 * @param response
	 * @param type
	 * @throws Exception
	 */
	@GetMapping(SecurityConstants.DEFAULT_VALIDATE_CODE_URL_PREFIX + "/{type}")
	public void createCode(HttpServletRequest request, HttpServletResponse response, @PathVariable String type)
			throws Exception {
		// 用到了模板方法模式
		validateCodeProcessorHolder.findValidateCodeProcessor(type).create(new ServletWebRequest(request, response));
	}

}

//import java.io.IOException;
//
//import javax.imageio.ImageIO;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.social.connect.web.HttpSessionSessionStrategy;
//import org.springframework.social.connect.web.SessionStrategy;
//import org.springframework.web.bind.ServletRequestUtils;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.RestController;
//import org.springframework.web.context.request.ServletWebRequest;
//
//import com.imooc.security.core.validate.code.image.ImageCode;
//import com.imooc.security.core.validate.code.image.ImageCodeGenerator;
//import com.imooc.security.core.validate.code.sms.SmsCodeGenerator;
//import com.imooc.security.core.validate.code.sms.SmsCodeSender;

///**
// * 4.7.3 创建验证码控制器
// * @author qilongfei
// *
// */
//@RestController
//public class ValidateCodeController {
//
//	public static final String SESSION_KEY_PREFIX = "SESSION_KEY_FOR_CODE_";
//	
//	private SessionStrategy sessionStrategy = new HttpSessionSessionStrategy();
//	
//	// 4.8.10 将业务移到ImageCodeGenerator
//	/*@Autowired
//	private SecurityProperties securityProperties;*/
//	
//	@Autowired
//	private ImageCodeGenerator imageCodeGenerator;
//	
//	@Autowired
//	private SmsCodeGenerator smsCodeGenerator;
//	
//	@Autowired
//	private SmsCodeSender smsCodeSender;
//	
//	/**
//	 * 4.7.4 生成验证码controller
//	 * @param request
//	 * @param response
//	 * @throws IOException 
//	 */
//	@GetMapping("/code/image")
//	public void createCode(HttpServletRequest request,HttpServletResponse response) throws IOException{
//		//ImageCode imageCode = generate(new ServletWebRequest(request));
//		// 4.8.11 控制器中改成用generator生成验证码
//		// ImageCode imageCode = imageCodeGenerator.generate(new ServletWebRequest(request));
//		// 4.10.6 改成继承模式强转
//		ImageCode imageCode = (ImageCode) imageCodeGenerator.generate(new ServletWebRequest(request));
//		
//		sessionStrategy.setAttribute(new ServletWebRequest(request), SESSION_KEY_PREFIX +"IMAGE", imageCode);
//		ImageIO.write(imageCode.getImage(), "JPEG", response.getOutputStream());
//	}
//
//	/**
//	 * 4.7.5 生成验证码
//	 * @param request
//	 * @return
//	 */
//	// 4.8.10 将业务移到ImageCodeGenerator
//	/*private ImageCode generate(ServletWebRequest request) {
//		// int width = 67;
//		// int height = 23;
//		// BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//
//		// 4.8.3 重构成从配置文件中取
//		int width = ServletRequestUtils.getIntParameter(request.getRequest(), "width", securityProperties.getCode().getImage().getWidth());
//		int height = ServletRequestUtils.getIntParameter(request.getRequest(), "height", securityProperties.getCode().getImage().getHeight());
//		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//		
//		Graphics g = image.getGraphics();
//		Random random = new Random();
//		g.setColor(getRandColor(200, 250));
//		g.fillRect(0, 0, width, height);
//		g.setFont(new Font("Times New Roman", Font.ITALIC, 20));
//		g.setColor(getRandColor(160, 200));
//		for (int i = 0; i < 155; i++) {
//			int x = random.nextInt(width);
//			int y = random.nextInt(height);
//			int xl = random.nextInt(12);
//			int yl = random.nextInt(12);
//			g.drawLine(x, y, x + xl, y + yl);
//		}
//
//		String sRand = "";
//
//		// for (int i = 0; i < 4; i++) {
//		// 4.8.3
//		for (int i = 0; i < securityProperties.getCode().getImage().getLength(); i++) {
//			String rand = String.valueOf(random.nextInt(10));
//			sRand += rand;
//			g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
//			g.drawString(rand, 13 * i + 6, 16);
//		}
//
//		g.dispose();
//
//		// return new ImageCode(image, sRand, 60);
//		// 4.8.3
//		return new ImageCode(image, sRand, securityProperties.getCode().getImage().getExpireIn());
//	}
//	
//	*//**
//	 * 4.7.6 随机获取颜色
//	 *//*
//	private Color getRandColor(int fc, int bc) {
//		Random random = new Random();
//		if (fc > 255) {
//			fc = 255;
//		}
//		if (bc > 255) {
//			bc = 255;
//		}
//		int r = fc + random.nextInt(bc - fc);
//		int g = fc + random.nextInt(bc - fc);
//		int b = fc + random.nextInt(bc - fc);
//		return new Color(r, g, b);
//	}*/
//	
//	/**
//	 * 4.10.1 生成短信验证码controller
//	 * @param request
//	 * @param response
//	 * @throws IOException 
//	 * @throws Exception 
//	 */
//	@GetMapping("/code/sms")
//	public void createSmsCode(HttpServletRequest request,HttpServletResponse response) throws IOException, Exception{
//		ValidateCode smsCode = smsCodeGenerator.generate(new ServletWebRequest(request));
//		sessionStrategy.setAttribute(new ServletWebRequest(request), SESSION_KEY_PREFIX + "SMS", smsCode);
//		// 4.10.11 发送短信
//		String mobile = ServletRequestUtils.getRequiredStringParameter(request, "mobile");
//		smsCodeSender.send(mobile, smsCode.getCode());
//	}	
//}
